#ifndef MEASURE_P_H
#define MEASURE_P_H

#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
#include "vdsdef.h"

#ifdef DEF_MEASURE_P_H
#define EXT_MEASURE_P
#else
#define EXT_MEASURE_P extern
#endif 
#define ADC_SIZE    8192
#define ADC_RATIO   6400

    typedef enum {
        // 电压参数
        MAX,
        MIN,
        PKPK,
        VTOP,
        VBASE, // 5	
        VAMP,
        AVERAGE,
        SQUARESUM,
        TRUERMS, // 9 周期均方根
        CURSORRMS, // 10 游标均方根	
        VOVERSHOOT,
        VPRESHOOT, // 12

        // 时间参数
        PERI,
        FREQ,
        RISETIME,
        FALLTIME,
        PWIDTH, // 5
        NWIDTH,
        PDUTY,
        NDUTY,
        WORKPERIOD, // 9 屏幕脉宽比

        // 计数值
        PPULS, // 正脉冲个数
        NPULS, // 负脉冲个数	
        RISINGEDGE, // 上升边沿个数
        FALLINGEDGE, // 4 下降边沿个数

        // 其他参数
        AREA, // 面积
        CYCLEAREA, // 2 周期面积

        MEASURE_ITEM_TOTAL,
    } MEASURE_ITEM_ENUM; //(!!! 如果要增加测量项，需要在最后面的ENUM添加，确保scpi_mesurement_snapshoot不会错)

    typedef struct {
        BOOL valid[MEASURE_ITEM_TOTAL]; // BOOL_TRUE--测量值可用，BOOL_FALSE--测量值不可用
        S32 onoff;
        S32 adc_without_zero[ADC_SIZE]; //不带零点的ADC数据
        S32 zero; //垂直零点表示的ADC值
        S32 inversed; //反相: 0-关，1-开
        S32 overflow;
        S32 waveSize;
        S32 stepValue;
        S32 voltScale;
        F64 voltUnit; //电压参量,每像素点多少mv
        F64 timePerData; //每个数据点的时间

        S32 start_position; //从哪个点开始计算
        S32 mindata_position; //计算最小值的数据在数组中的位置
        S32 maxdata_position; //计算最大值的数据在数组中的位置
        S32 middle_value; //中间值，算屏幕频率周期时有用

        // CPU计算的周期、频率 及 硬件频率计(触发频率)
        S32 cpu_calc_data_counter; //屏幕周期数据个数
        S32 cpu_calc_cyc_counter; //屏幕周期个数
        S32 cpu_calc_fullscreen; //屏幕满屏数据

        // 设置:以 Vamp 进行计算
        S32 Vhigh; // Vbase+Vamp*0.9
        S32 Vmid; // Vbase+Vamp*0.5
        S32 Vlow; // Vbase+Vamp*0.1

        F64 freq; // 触发频率
        F64 period; // 触发频率对应的周期

        S32 Vtop; //顶端值
        S32 Vbase; //底端值
        S32 Vamp; //幅度值
        S32 max; //最大值
        S32 min; //最小值
        S32 pk_pk; //峰峰值

        S32 riseP1; //第一个上升沿位置
        S32 riseP2; //第二个上升沿位置
        S32 fallP1; //第一个下降沿位置
        S32 fallP2; //第二个下降沿位置
        S32 peridDataSum; //周期点数
        S32 edgeBeing; //判断是否存在边沿

        S32 riseTime; //上升时间
        S32 fallTime; //下降时间

        S32 PWidth; //正脉宽
        S32 NWidth; //负脉宽
        S32 riseFirst; //第一个上升沿，用于计算周均方根值
        S32 riseSecond;
        S32 fallFirst;
        S32 fallSecond;

        S32 risePos; //上升位置
        S32 fallPos; //下降位置
        S32 firstEdge; //判断第一个沿是上升沿或是下降沿，只有通道1是有效的


        F64 VOverShoot; // 过冲
        F64 VPreShoot; // 预冲
        F64 average; // 平均值
        F64 Vrms; //均方根值
        F64 PDuty; // 正占空比
        F64 NDuty; // 负占空比

        S32 delay_first_rise_edge_pos;
        S32 delay_first_fall_edge_pos;
        S32 delay_last_rise_edge_pos;
        S32 delay_last_fall_edge_pos;

        F64 cycleRMS; //周期均方根值
        F64 cursorRMS; //游标均方根
        F64 workPeriod; //工作周期
        S32 PPulseNum; //正脉冲个数
        S32 NPulseNum; //负脉冲个数
        S32 risingEdgeNum; //上升边沿个数
        S32 fallingEdgeNum; //下降边沿个数
        F64 area; //面积
        F64 cycleArea; //周期面积- 当存在周期点数时有效

        F64 pauseRMS; //脉冲均方根值
    } MeasureItem;

    typedef enum {
        RISEDELAY, // 上升沿延迟
        FALLDELAY, // 10 下降沿延迟
        RISEPHASEDELAY, // 上升沿相位
        FALLPHASEDELAY, // 12 下降沿相位

        DELAY_FRR, // 信号源 1 的第一个上升沿与信号源 2 的第一个上升沿之间的时间.
        DELAY_FRF, // 信号源 1 的第一个上升沿与信号源 2 的第一个下降沿之间的时间.
        DELAY_FFR, // 信号源 1 的第一个下降沿与信号源 2 的第一个上升沿之间的时间.
        DELAY_FFF, // 信号源 1 的第一个下降沿与信号源 2 的第一个下降沿之间的时间.
        DELAY_LRR, // 5 信号源 1 的第一个上升沿与信号源 2 的最后一个上升沿之间的时间.
        DELAY_LRF, // 信号源 1 的第一个上升沿与信号源 2 的最后一个下降沿之间的时间.
        DELAY_LFR, // 信号源 1 的第一个下降沿与信号源 2 的最后一个上升沿之间的时间.
        DELAY_LFF, // 信号源 1 的第一个下降沿与信号源 2 的最后一个下降沿之间的时间.	

        MEASURE_DEALY_TOTAL
    } MEASURE_DEALY_ENUM;

    typedef struct {
        S32 delayRR[CH_TOTAL][CH_TOTAL]; // 通道间参数: 上升沿延迟: 从信号源 1 的第一个上升沿位置开始，搜索到信号源 2 的首个上升沿之间的时间.
        S32 delayFF[CH_TOTAL][CH_TOTAL]; // 通道间参数: 下降沿延迟: 从信号源 1 的第一个下降沿位置开始，搜索到信号源 2 的首个下降沿之间的时间.
        F64 phaseRR[CH_TOTAL][CH_TOTAL]; // 通道间参数: 上升沿相位
        F64 phaseFF[CH_TOTAL][CH_TOTAL]; // 通道间参数: 下降沿相位	

        F64 FRR[CH_TOTAL][CH_TOTAL]; // 信号源 1 的第一个上升沿与信号源 2 的第一个上升沿之间的时间.
        F64 FRF[CH_TOTAL][CH_TOTAL]; // 信号源 1 的第一个上升沿与信号源 2 的第一个下降沿之间的时间.
        F64 FFR[CH_TOTAL][CH_TOTAL]; // 信号源 1 的第一个下降沿与信号源 2 的第一个上升沿之间的时间.
        F64 FFF[CH_TOTAL][CH_TOTAL]; // 信号源 1 的第一个下降沿与信号源 2 的第一个下降沿之间的时间.
        F64 LRR[CH_TOTAL][CH_TOTAL]; // 信号源 1 的第一个上升沿与信号源 2 的最后一个上升沿之间的时间.
        F64 LRF[CH_TOTAL][CH_TOTAL]; // 信号源 1 的第一个上升沿与信号源 2 的最后一个下降沿之间的时间.
        F64 LFR[CH_TOTAL][CH_TOTAL]; // 信号源 1 的第一个下降沿与信号源 2 的最后一个上升沿之间的时间.
        F64 LFF[CH_TOTAL][CH_TOTAL]; // 信号源 1 的第一个下降沿与信号源 2 的最后一个下降沿之间的时间.	

        BOOL valid[MEASURE_DEALY_TOTAL][CH_TOTAL][CH_TOTAL]; // BOOL_TRUE--测量值可用，BOOL_FALSE--测量值不可用。
    } MeasureDelay;

    typedef struct {
        MeasureItem measItem[CH_TOTAL];
        MeasureDelay measDelay;
    } MeasureParam;

    EXT_MEASURE_P MeasureParam measureParam;

#ifdef __cplusplus
}
#endif

#endif /* MEASURE_P_H */

